# /**
# 建造者模式（Builder Pattern）
#
# 意图：将一个复杂的构建与其表示相分离，使得同样的构建过程可以创建不同的表示。
# 主要解决：主要解决在软件系统中，有时候面临着"一个复杂对象"的创建工作，其通常由各个部分的子对象用一定的算法构成；由于需求的变化，这个复杂对象的各个部分经常面临着剧烈的变化，但是将它们组合在一起的算法却相对稳定。
# 何时使用：一些基本部件不会变，而其组合经常变化的时候。
# 如何解决：将变与不变分离开。
# */
#
#
'''

建造型模式用于创建过程稳定(零件供应)，但配置多变(组装要求)的对象。
tip:对考量者来说,忽略了(若你能物理思考上)配置的差异,运作过程是同的
在《设计模式》一书中的定义是：将一个复杂的构建与其表示相分离，
使得同样的构建过程可以创建不同的表示。
'''

"""
建造者模式可以将部件制造和其组装过程分开，一步一步创建一个复杂的对象
对组装来说:而无须知道其内部的具体构造细节,因为(物理实践也允许)忽略了部件的配置差异,组装过程同
对部件来说:无需知道其外部的具体组装细节,因为涉及它的组装过程,部件同
"""

#主要实践情景是:一些可供选择的基本部件不会变，而其选择的组合经常变化的时候。
#建造者 - 指挥者模型

#建造者:用于实施具体某一部件的建造流程


class Builder():
    """建造流程：封面 isbn"""
    def __init__(self):
        self.frontCover = None
        self.isbn = None

    def run(self):
        print('封面: %s | ISBN: %s' % (self.frontCover, self.isbn))


class BookWithFrontCover(Builder):
    """方案A，有封面"""
    def get_front_cover(self):
        self.frontCover = "封面"

    def get_isbn(self):
        self.isbn = "493589040405"


class BookWithoutFrontCover(Builder):
    """方案B，没有封面"""
    def get_front_cover(self):
        self.frontCover = None

    def get_isbn(self):
        self.isbn = None

#指挥者:请求组装,并返回成品
class Director:
    """调度："""
    def __init__(self):
        self.programme = None

    def build(self):
        self.programme.get_front_cover()
        print("封面:{}".format(self.programme.frontCover))
        self.programme.get_isbn()
        print("isbn:{}".format(self.programme.isbn))
        self.programme.run()


if __name__ == '__main__':
    # 没有封面的书籍builder
    test = Director()
    test.programme = BookWithoutFrontCover()
    test.build()

    # 带有封面的书籍builder
    test = Director()
    test.programme = BookWithFrontCover()
    test.build()